<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /* 
                call 和 apply 是函数对象的方法，通过函数对象来调用

                    函数对象调用call，apply，会执行pull函数
                    第一个参数：修改函数this的指向

            this的情况：
                1. 以函数形式调用时，this永远都是window
                2.以方法的形式调用时，this是调用方法的对象
                3.以构造函数的形式调用时，this是新创建的那个对象
                4.使用call和apply调用时，this是指定的那个对象
            
            arguments: 保存实参的类数组的对象  ， 和 this 一样都是浏览器传入的隐含的参数
        */

        function pull(a, b) {
            console.log(this, a, b);
            console.log(arguments.length); // 传入的实参的个数
            console.log(arguments[0]);
        }

        pull.call(); // this是window
        pull.apply(); // this是window

        var obj = {
            name: "tutu"
        };
        pull.call(obj, 2, 3); // this是obj
        pull.apply(obj, [2, 3]); // this是obj  ; apply 传参需封装到数组中
    </script>
</body>

</html>